{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 变量的声明和赋值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "//"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "//定以后初始化变量\n",
    "int salary;\n",
    "salary = 5000;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 变量可以在声明的时候被初始化（指定一个初始值）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "extern int d = 3, f = 5;    // d 和 f 的声明 \n",
    "int d = 3, f = 5;           // 定义并初始化 d 和 f\n",
    "byte z = 22;                // 定义并初始化 z\n",
    "char x = 'x';               // 变量 x 的值为 'x'\n",
    "\n",
    "//定义时初始化变量\n",
    "int salary = 5000;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 变量命名\n",
    "变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的，因为 C++ 是大小写敏感的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 注意1，变量命名规范"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "my_name\n",
    "myName"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 注意2，一行声明多个变量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "int salary1,salary2,salary3\n",
    "salary = 5000;\n",
    "salary = 6000;\n",
    "salary = 7000;\n",
    "\n",
    "int salary1=8000,salary2=9000,salary3=10000"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 注意3，符号两边要空格"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "int salary = 5000;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 可打印多行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cout << \"我的工资\" << salary1\n",
    "    << \"他的工资\" << salary1 << endl;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 其他类型的变量\n",
    "C++ 也允许定义各种其他类型的变量，比如枚举、指针、数组、引用、数据结构、类等等，这将会在后续的章节中进行讲解。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 什么是常量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "const int c=5;\n",
    "#define c 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#define MAX 255\n",
    "const float MAX = 255;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# define const 区别\n",
    "\n",
    "* const和#define都有类似的功能，那就是定义一个“常量”；\n",
    "* 宏替换定义常量有一定的缺陷：不做类型检查，没有作用域限制\n",
    "* const定义的常量有类型名字，存放在内存的静态区域中，在程序运行过程中const变量只有一个拷贝，而#define 所定义的宏变量却有多个拷贝，所以宏定义在程序运行过程中所消耗的内存要比const变量的大得多；\n",
    "* 用define定义的常量是不可以用指针变量去指向的，用const定义的常量是可以用指针去指向该常量的地址的；\n",
    "* 用define可以定义一些简单的函数，const是不可以定义函数的.\n",
    "* const用于类成员变量的定义，只要一定义，不可修改。define 不可用于类成员变量的定义，但是可以用于全局变量。\n",
    "* const不能在条件语法中定义，而define可以，比如在if…else..中\n",
    "* const采用一个普通的常量名称，define可以采用表达式作为名称\n",
    "* const只能接受静态的标量，而define可以采用任何表表达式\n",
    "* const定义常量时大小写是敏感的，而define可通过第三个参数（true）来指定大小写是否敏感\n",
    "* 就起作用的阶段而言： #define是在编译的预处理阶段起作用，而const是在 编译、运行的时候起作用                                             \n",
    "* 就起作用的方式而言： #define只是简单的字符替换，没有类型检查,存在边界的错误；const对应数据类型，进行类型检查；                                                                                                * 就存储方式而言：#define只是进行展开，有多少地方使用，就替换多少次，它定义的宏常量在内存中有若干个备份,占用代码段空间；const定义的只读变量在程序运行过程中只有一份备份，占用数据段空间。   \n",
    "* 从代码调试的方便程度而言： const常量可以进行调试的，define是不能进行调试的，因为在预编译阶段就已经替换掉了。                                                                                                    * 从是否可以再定义的角度而言： const不足的地方，是与生俱来的，const不能重定义，而#define可以通过#undef取消某个符号的定义，再重新定义。\n",
    "* 从某些特殊功能而言： define可以用来防止头文件重复引用，而const不能;\n",
    "* 从用于类中来看：const用于类成员变量的定义，只要一定义，不可修改。define 不可用于类成员变量的定义，但是可以用于全局变量。\n",
    "* const采用一个普通的常量名称，define可以采用表达式作为名称；\n",
    "* const定义常量时大小写是敏感的，而define可通过第三个参数（true）来指定大小写是否敏感\n",
    "* const不能在条件语法中定义，而define可以，比如在if…else..中"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结，尽可能的少用 define"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# typedef声明\n",
    "\n",
    "您可以使用 typedef 为一个已有的类型取一个新的名字。  \n",
    "* 例如，下面的语句会告诉编译器，feet 是 int 的另一个名称：  \n",
    "<code>typedef int feet;</code>\n",
    "* 现在，下面的声明是完全合法的，它创建了一个整型变量 distance：  \n",
    "<code>feet distance;</code>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#include <iostream>\n",
    "using namespace std;\n",
    "int main()\n",
    "{\n",
    "\tint a = 10;\n",
    "\t//为整型重新命名\n",
    "\ttypedef int zhengxing;\n",
    "\tzhengxing b = 10;\n",
    "\tcout << a << endl;\n",
    "\tcout << b << endl;\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# extern \n",
    "就是告诉编译器：“你现在编译的文件中，有一个标识符虽然没有在本文件或本文件当前位置中定义，但是它是在别的文件中或本文件其它位置定义的全局变量，你要放行！”"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "extern int cnt;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#include \"04_extern.h\"\n",
    "#include <iostream>\n",
    "using namespace std;\n",
    "\n",
    "int main() {\n",
    "\tcout << cnt << endl;\n",
    "\treturn 0;\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#include \"04_extern.h\"\n",
    "int cnt = 5;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 函数声明\n",
    "同样的，在函数声明时，提供一个函数名，而函数的实际定义则可以在任何地方进行。例如："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "// 函数声明\n",
    "int func();\n",
    " \n",
    "int main()\n",
    "{\n",
    "    // 函数调用\n",
    "    int i = func();\n",
    "}\n",
    " \n",
    "// 函数定义\n",
    "int func()\n",
    "{\n",
    "    return 0;\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 有效数字\n",
    "std::cout.precision(20);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 枚举类型\n",
    "* 枚举类型(enumeration)是C++中的一种派生数据类型，它是由用户定义的若干枚举常量的集合。\n",
    "\n",
    "* 如果一个变量只有几种可能的值，可以定义为枚举(enumeration)类型。所谓\"枚举\"是指将变量的值一一列举出来，变量的值只能在列举出来的值的范围内。\n",
    "\n",
    "* 创建枚举，需要使用关键字 enum。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "//下面的代码定义了一个颜色枚举，变量 c 的类型为 color。最后，c 被赋值为 \"blue\"。\n",
    "enum color { red, green, blue } c;\n",
    "c = blue;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "//默认情况下，第一个名称的值为 0，第二个名称的值为 1，第三个名称的值为 2，以此类推。但是，您也可以给名称赋予一个特殊的值，只需要添加一个初始值即可。\n",
    "//例如，在下面的枚举中，green 的值为 5。\n",
    "enum color { red, green=5, blue };\n",
    "//在这里，blue 的值为 6，\n",
    "//因为默认情况下，每个名称都会比它前面一个名称大 1，但 red 的值依然为 0。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
